/*
* description
: tpipe.c
* copyright
: (C) by zhanghonglie
* Function
: 利用管道实现在在线程间传递整数
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
void task1(int *); //线程1执行函数原型
void task2(int *); //线程2执行函数原型
int pipe1[2],pipe2[2];//存放两个无名管道标号
pthread_t thrd1,thrd2;//存放两个线程标识

int main(int argc,char *arg[])
{
    int ret;
    int num1,num2;
    //使用pipe()系统调用建立两个无名管道。建立不成功程序退出,执行终止
    if(pipe(pipe1) < 0){
        perror("pipe not create");
        exit(EXIT_FAILURE);
    }
    if(pipe(pipe2) < 0){
        perror("pipe not create");
        exit(EXIT_FAILURE);
    }
    //使用pthread_create系统调用建立两个线程。建立不成功程序退出,执行终止
    num1 = 1 ;

    ret = pthread_create(&thrd1,NULL,(void *) task1,(void *) &num1);
    if(ret){
        perror("pthread_create: task1");
        exit(EXIT_FAILURE);
    }
    num2 = 2 ;
    ret = pthread_create(&thrd2,NULL,(void *) task2,(void *) &num2);

    if(ret){
        perror("pthread_create: task2");
        exit(EXIT_FAILURE);
    }
    //挂起当前线程切换到thrd2线程
    pthread_join(thrd2,NULL);
    //挂起当前线程切换到thrd1线程
    pthread_join(thrd1,NULL);
    exit(EXIT_SUCCESS);
}
    //线程1执行函数,它首先向管道写,然后从管道读
void task1(int *num)
{
    int x=1;
    //每次循环向管道1的1端写入变量X的值,并从
    //管道2的0端读一整数写入X再对X加1,直到X大于10
    do{
        printf("thread%d read: %d\n",*num,x++);
        write(pipe1[1],&x,sizeof(int));//阻塞等待task2的读
        read(pipe2[0],&x,sizeof(int));//阻塞等待task2的写
    }while(x<=9);
    //读写完成后,关闭管道
    close(pipe1[1]);
    close(pipe2[0]);
    }
    //线程1执行函数,它首先从管道读,然后向管道写
//管道的读写默认的通信方式为同步读写方式,即如果管道读端无数据则读者阻塞直到数据到达,反之如果管道写端有数据则写者阻塞直到数据被读走
void task2(int * num)
{
    int x;
    //每次循环从管道1的0端读一个整数放入变量X中,
    //并对X加1后写入管道2的1端,直到X大于10
    do{
        read(pipe1[0],&x,sizeof(int));
        printf("thread2 read: %d\n",x++);
        write(pipe2[1],&x,sizeof(int));
    }while( x<=9 );
    //读写完成后,关闭管道
    close(pipe1[0]);
    close(pipe2[1]);
}
